-
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바이트라고 한걸 본거같은데 다시 자세히 공부해야 할것같다. 헷갈리네....
개행문자는 계산하지 않으므로 주의하자
반응형