달력

012018  이전 다음

  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
  •  

Java File I/O

개발하면서 2009.06.24 10:11

요새 검색엔진을 공부하고 있어서 그런지(핑계...ㅋ)블로그가 뜸했다.
여태까지 개발하면서 의문점이 들었던것들 하나하나 공부해보자

byte 단위로 읽은 File I/O 에서 skip, seek은 \r\n까지 계산해서 이동한다
우선 검색엔진 개발하면서 파일을 다뤄야되는데
바이트 단위로 읽을경우, file_size는  다음과 같이 구해야한다고 한다. (skip을하기 위해서)

try
		{
			BufferedReader reader = new BufferedReader	(new FileReader(filename));
			while((str = reader.readLine()) != null)
			{
				doc.append(str);
//				line = str.getBytes();
//				F_Size = F_Size + line.length+2;
				F_Size = F_Size + str.length()+2;		// \r\n부분
				System.out.println("str : " + str + ",  file_size : " + F_Size);
				if(str.equals("<doc>"))
				{
					doc_loc.add(F_Size-7);
					doc_begin = F_Size-7;
					branch_end = 0;
					branch_begin = 0;
				}

carriage return 때문이라고 하는데  이에 대해서는 아래 완전 이해잘되게 설명했으니 패스
http://mwultong.blogspot.com/2006/06/line-feed-lf-carriage-return-cr.html

정말 윈도우랑 리눅스랑 텍스트 표현방식이 다른지 알아보자
soundex.c는 리눅스에서
dong1.xml은 윈도우에서 작성한 파일이다.

더보기




두번째 File I/O 에서 byte, String의 length 차이를 알아보자


import java.io.*;
public class Test
{
	public static void main(String[] args)
	{
		try
		{
			BufferedReader br = new BufferedReader(new FileReader("dong1.xml"));
			
			String str = new String();
			byte[] buf = new byte[100];
			
			while((str = br.readLine()) != null)
			{
				System.out.println("Input Line : " + str);
				System.out.println("str : "+str.length());
				buf = str.getBytes();
				System.out.println("buf : " +buf.length);
			}
		}
		catch(IOException e)
		{
			e.printStackTrace();
		}
	}
}
String에서는 한글, 영어 다 1로 간주하고 byte 에서는 한글 2, 영어 1로 간주한다.
유니코드에서 한글은 3바이트라고 한걸 본거같은데 다시 자세히 공부해야 할것같다. 헷갈리네....
개행문자는 계산하지 않으므로 주의하자

Posted by 오산돌구
TAG