2014-09-11 2 views
0

텍스트 파일에 쓰려고 시도하는 문자열 배열 toFile[]이 있습니다. 테스트하는 동안, 나는 스팅이 윈도우 경계에 도달하면 메모장이 문자열을 다음 줄로 감싸지 않는다는 것을 상기 시켰습니다. 완벽 주의자이기 때문에 문자열을 길이가 250자인 부분 문자열로 분할하고 각 문자열을 파일에 쓰고 각 부분 문자열 다음에 새 줄을 긋기를 원합니다.텍스트 파일의 여러 줄에 문자열을 쓰는 데 도움이 필요합니다.

테스트를 진행하는 동안 문제가 발생하여 해결할 수없는 것으로 판단되면 내 프로그램이 루프를 한 번 실행 한 다음 오류가 발생하여 오류가 발생합니다.

출력 및 오류의 예 :

내 코드
toFile[2].length = 2432 

temp.length = 250 
split = 250 
iLength = 2182 

temp.length = 0 
split = 500 
iLength = 1932 

java.lang.StringIndexOutOfBoundsException: String index out of range: -250 

:

System.out.println("toFile[2].length = "+Integer.toString(toFile[2].length())); 
System.out.println(""); 
if(toFile[2].length()>250){ 
    int iLength=toFile[2].length(), split = 0; 
    while(iLength>250){ 
     String temp = toFile[2]; 
     temp = temp.substring(split, 250); 
     System.out.println("temp.length = "+Integer.toString(temp.length())); 
     bw.write(temp);bw.newLine(); 
     split=split+250; 
     System.out.println("split = "+Integer.toString(split)); 
     iLength=iLength-250; 
     System.out.println("iLength = "+Integer.toString(iLength)); 
     System.out.println(""); 
    } 
    bw.write(toFile[2].substring(split)); 
}else{bw.write(toFile[2]);bw.newLine();} 
bw.newLine(); 

는 또한 전체 문자열을 통해 실행하지만 여전히 하나에 문자열을 씁니다이 while 루프를 시도했다 줄 :

int iLength=toFile[2].length(), start = 0; 
String temp = toFile[2]; 
while(iLength>250){ 
    bw.write(temp,start,250); 

    start=start+250; 
    System.out.println("start = "+Integer.toString(start)); 

    iLength=iLength-250; 
    System.out.println("iLength = "+Integer.toString(iLength)); 
    System.out.println(""); 
} 
+0

http://www.codingeek.com/ 당신은 중첩 루프를 필요로 방문 할 수 있습니다 .. 당신이 문자열을하거나 당신이 할 수있는 모든 시간을 종료 인덱스를 증가 총 2 개의 루프). 바깥 쪽 루프는 배열의 모든 문자열 인 toFile을 반복합니다.내부 루프는 문자를 250으로 계산합니다. – markspace

+0

@markspace 배열에는 9 개의 문자열 만 포함됩니다. 그 중 9 개는 길이에 대해 몇 가지만 확인하면됩니다. – TehNoiseBomb

+0

여전히 두 개의 루프가 필요합니다. 문자열을 요청 된 길이로 분할하는 것 외에는 아무 것도 수행하지 않는 방법을 시도해보십시오. 문제를 더 작은 것으로 분해하는 데 도움이 될 것입니다. 그런 다음 해당 메서드를 호출해야하는 문자열을 호출합니다. – markspace

답변

1

그냥 올바른 것은 내가 코드의 나머지 부분은 잘 작동하고 현재의 에러를 알려주지 수 있기를 바랍니다. 다음과 같이 수정하십시오. 아래의 문장에서 당신은 종료 인덱스의 값을 고정하는 즉, 250

temp = temp.substring(split, 250); 

이 당신이 처음에 대한 코드를 실행하면 잘 작동하고로 실행하기 때문에 온도에 길이 250의 문자열을 저장 temp = temp.substring(0, 250);입니다. 왜냐하면 split=0입니다.

split become 250 번째 및 방법 temp = temp.substring(250, 250);으로 실행하고 temp.length는 0 간다.

하지만 다음에 시작 색인이 끝 색인을 초과합니다. 즉, temp = temp.substring(500, 250);이 당신의 경우에 오류를 던지고 있습니다.

그래서 그렇게 (자바에있는 다른 흥미로운 문제 해결에 대한 게시물 temp = temp.substring(split, split + 250);

당신이

0

먼저 toFile[] 컨테이너를 반복해야합니다. 모든 문자열을 다른 기능으로 차례대로 처리하십시오.

public static void main (String[] args) throws java.lang.Exception 
    { 
     String[] toFile = new String[]{ ... }; 
     BufferedWriter bw = new BufferedWriter(...); 

     for (String line : toFile) { 
     write(line, bw); 
     } 

    } 

다음 단계는 각 문자열을 작성하는 방법을 설명합니다. 이를 수행하는 한 가지 방법은 250 자의 청크를 작성하는 것입니다. 당신이 확인해야 할 유일한 것은 마지막 부분은 StringIndexOutOfBoundsException

private static void write(String line, BufferedWriter bw) throws IOException { 
     int length = line.length(); 

     if (length > SPLIT) {   
     int offset = 0; 
     while (offset < length) { 
      int remaining = length - offset;    
      bw.write(line, offset, remaining < SPLIT ? remaining : SPLIT); 
      bw.newLine();    
      offset += SPLIT; 
     }   
     } else {   
     bw.write(line);   
     bw.newLine(); 
     } 

    } 

을 방지하기 위해, 250보다 작을 수 있습니다 그리고 그 모든 점이다. 그러나 문자열에 텍스트가 포함되어 있으면 250 자 정도의 덩어리로 분할하는 것이 가장 좋은 방법은 아닙니다. 단어를자를 수 있기 때문입니다.

전체 예제 코드 : 코드에서 http://ideone.com/jQKe7Y

관련 문제