ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java File I/O
    개발하면서/etc 2009. 6. 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바이트라고 한걸 본거같은데 다시 자세히 공부해야 할것같다. 헷갈리네....
    개행문자는 계산하지 않으므로 주의하자

    반응형

    댓글

Designed by Tistory.