2014-09-21 1 views
0

RandomAccessFile 클래스를 사용하려고하지만 문자열에 문제가 있습니다.Endline StringBuilder in RandomAccessFile

이것은 첫 번째 부분입니다. 내가 읽은 희망하는 경우는,

File file = new File("/home/pep/java/randomFile.dat"); 
    RandomAccessFile randomFile = new RandomAccessFile(file, "r"); 

    char[] surname = new char[10]; 
    char aux; 
    int id, dep, pos; 
    Double salary; 

    pos = 0; 

    for (;;) { 
     randomFile.seek(pos); 
     id = randomFile.readInt(); 
     for (int i = 0; i < surname.length; i++) { 
      aux = randomFile.readChar(); 
      surname[i] = aux; 
     } 
     String surnameStr = new String(surname); //HERE IS THE PROBLEM!! 
     dep = randomFile.readInt(); 
     salary = randomFile.readDouble(); 
     System.out.println("ID: " + id + ", Surname: " + surnameStr + ", Departament: " + dep + ", Salary: " + salary); 

     pos = pos + 36; // 4 + 20 + 4 + 8 

     if (randomFile.getFilePointer() == randomFile.length()) 
      break; 
    } 
    randomFile.close(); 
} 

음 :

ID : 1, 성을 : 파일에 쓰기 :

public static void main(String[] args) throws IOException { 
    File file = new File("/home/pep/java/randomFile.dat"); 
    RandomAccessFile fitxerAleatori = new RandomAccessFile(file, "rw"); 

    String[] surnames = { "SMITH", 
      "LOMU" }; 
    int[] dep = { 10, 
      20 }; 
    Double[] salary = { 1200.50, 
      1200.50 }; 

    StringBuilder buffer = null; 
    int n = surnames.length; 

    for (int i = 0; i<n; i++){ 
     randomFile.writeInt(i+1); //ID 
     buffer = new StringBuilder(surnames[i]); 
     buffer.setLength(10); //10 characters 
     randomFile.writeChars(buffer.toString()); 
     randomFile.writeInt(dep[i]); 
     randomFile.writeDouble(salary[i]); 
    } 
    randomFile.close(); 
} 

을 두 번째 부분에서,이 파일을 읽어보십시오 SMITH , 출발지 : 10 급여 : 1200.50

내가 recived :

ID : 1, 성 : SMITH

그것은 내가이 성을 표시하지 않는 경우, 다른 정보가 정확하기 때문에, 라인의 끝이 성에서 같다.

감사합니다.

답변

0

문제는 char 배열했다. 즉, 문자 읽기 나는 루프 드 변경 : 널 (null)이 10 자보다 짧은 문자열을 기록하게됩니다

for (int i = 0; i < surname.length; i++) { 
      aux = randomFile.readChar(); 
      surname[i] = aux != 0 ? aux : ' '; 
     } 
+0

문제는 데이터 자체에 있습니다. 10 자 미만의 문자열을 처리하는 방법에 대해서는 사용자가 동의하지 않았습니다. – EJP

1

cognom은 어디에서 왔습니까? [편집 : 좋아, 찾았 어. 카탈로니아 어 입니다. 그리고 지금은 오타는 departamento에서 오는 것입니다. : -]

문제가있는 줄 앞에 System.out.println(Arrays.toString(surname))을 삽입하면 어떻게됩니까? 나는 그것이 [S, M, I, T, H, [], [], [], []] (Eclipse의 콘솔보기에서)와 같은 것으로 가정합니다. 여기서 []은 정사각형, 즉 인쇄 할 수없는 문자를 나타냅니다.

System.out.println((int) surname[5])을 삽입하면 어떻게됩니까? 나는 그것이 0이라고 가정한다. 그리고이 0 값이 문제의 원인이라고 가정한다.

정확하게 10 자 길이의 성을 사용하면 어떻게됩니까?

힌트 1 : Departament에 오타가 있습니다.

힌트 2 : System.out.printf(...)에게 기회는 println(...)입니다.

힌트 3 : 솔루션의 if은 더 우아한 단축 할 수 있습니다

cognom[i] = aux != 0 ? aux : ' '; 
+0

cognom -> 성 – user2592044

+0

System.out.println (Arrays.toString (surname)); -> [S, M, I, T, H, – user2592044

+0

System.out.println ((int) 성 [5 ]) -> 0 – user2592044

0

StringBuffer를 생성하고 10까지의 길이를 설정, 그리고 때 그 차례로 디코딩 문제가 발생합니다 독서. 문자열을 만들고, 공백으로 십여 문자로 채우고,을 10 개의 문자로 채우고, 쓰고, 결과 문자열을 읽었을 때 trim()하십시오.