2017-10-02 1 views
2

그래서, 조금 주위에 stackoverflow 검색했지만이 문제에 대한 답변을 찾을 수 없습니다.프로그램의 작성이 .txt 파일로 지연 되었습니까?

나의 CS 수업을위한 나의 숙제는 5000 개의 난수를 가진 파일을 읽고 배열에 넣는 것, 숫자가 몇 번 나왔는지 확인하는 것, 그리고 가장 길게 늘어나는 시퀀스를 찾는 것 입니다. 나는 그 모든 것을 잘 처리했습니다.

이 외에도 필자는 파일을 덮어 쓰고 5000 개의 새로운 난수를 작성하여 여러 코드 테스트 케이스에서 코드가 작동하는지 확인하는 방법을 추가하고 있습니다.

이 메서드는 대부분 작동하지만, 호출 한 후에는 나머지 프로그램이 완료 될 때까지 "활성화"하지 않는 것 같습니다. 실행하여 숫자를 변경하도록 지시하면 프로그램에서 변경된 값을 실제로보기 위해 다시 실행해야합니다. 이 문제를 해결할 수있는 방법이 있습니까? 데이터를 변경하는 사이의 지연을 도시

전류 출력 :

데이터 여기 - 제어 소문자를 변경하려고 없음.

elkshadow5$ ./CompileAndRun.sh 

Create a new set of numbers? Y for yes. n 
What number are you looking for? 66 
66 was found 1 times. 
The longest sequence is [606, 3170, 4469, 4801, 5400, 8014] 
It is 6 numbers long. 

숫자는 여기에서 변경해야하지만 변경하지 않아야합니다.

elkshadow5$ ./CompileAndRun.sh 

Create a new set of numbers? Y for yes. y 
What number are you looking for? 66 
66 was found 1 times. 
The longest sequence is [606, 3170, 4469, 4801, 5400, 8014] 
It is 6 numbers long. 

지금 데이터가 변경된 것을 보여준다, 데이터 후 실행이 변경되어 있어야합니다.

elkshadow5$ ./CompileAndRun.sh 

Create a new set of numbers? Y for yes. n 
What number are you looking for? 1 
1 was found 3 times. 
The longest sequence is [1155, 1501, 4121, 5383, 6000] 
It is 5 numbers long. 

내 코드 :

import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.util.Scanner; 

public class jeftsdHW2 { 
static Scanner input = new Scanner(System.in); 

public static void main(String args[]) throws Exception { 
    jeftsdHW2 random = new jeftsdHW2(); 
    int[] data; 
    data = new int[5000]; 
    random.readDataFromFile(data); 
    random.overwriteRandNums(); 
} 
public int countingOccurrences(int find, int[] array) { 
    int count = 0; 
    for (int i : array) { 
     if (i == find) { 
      count++; 
     } 
    } 
    return count; 
} 
public int[] longestSequence(int[] array) { 
    int[] sequence; 
    return sequence; 
} 
public void overwriteRandNums() throws Exception { 
    System.out.print("Create a new set of numbers? Y for yes.\t"); 
    String answer = input.next(); 
    char yesOrNo = answer.charAt(0); 
    if (yesOrNo == 'Y' || yesOrNo == 'y') { 
     writeDataToFile(); 
    } 
} 
public void readDataFromFile(int[] data) throws Exception { 
    try { 
     java.io.File infile = new java.io.File("5000RandomNumbers.txt"); 
     Scanner readFile = new Scanner(infile); 

     for (int i = 0; i < data.length; i++) { 
      data[i] = readFile.nextInt(); 
     } 
     readFile.close(); 
    } catch (FileNotFoundException e) { 
     System.out.println("Please make sure the file \"5000RandomNumbers.txt\" is in the correct directory before trying to run this."); 
     System.out.println("Thank you."); 
     System.exit(1); 
    } 
} 
public void writeDataToFile() throws Exception { 
    int j; 
    StringBuilder theNumbers = new StringBuilder(); 
    try { 
     PrintWriter writer = new PrintWriter("5000RandomNumbers.txt", "UTF-8"); 
     for (int i = 0; i < 5000; i++) { 
      if (i > 1 && i % 10 == 0) { 
       theNumbers.append("\n"); 
      } 
      j = (int) (9999 * Math.random()); 
      if (j < 1000) { 
       theNumbers.append(j + "\t\t"); 
      } else { 
       theNumbers.append(j + "\t"); 
      } 
     } 
     writer.print(theNumbers); 
     writer.flush(); 
     writer.close(); 
    } catch (IOException e) { 
     System.out.println("error"); 
    } 
} 
} 
+0

걸리는 시간을 지정하지 않았습니다. –

+1

은 매번 _ 연속 된 코드 _ 파일에서 읽습니까? 코드의 해당 부분을 공유 할 수 있습니까? –

+0

얼마나 오래 걸리는지 표시하려고했으나 프로그램 실행이 끝날 때까지 파일에 쓰지 않습니다. longestSequence에 대해 인쇄 할 숫자가 다음에 실행될 때까지 변경되지 않기 때문에 "감지"합니다. – elkshadow5

답변

-1

파일이 물리적으로 디스크에 기록되지 않았 음을 수 플러시를 사용하여 자바 문서 here에서이 충분히되지 않습니다 :

이 스트림의 대상이 기본 운영 체제에서 제공하는 추상화 (예 : 파일) 인 경우 스트림을 플러시하면 이전에 스트림에 기록 된 바이트 만이 스트림으로 전달됩니다. 쓰기를위한 운영체제; 실제로 디스크 드라이브와 같은 물리적 장치에 기록된다는 것을 보증하지는 않습니다.

하드 디스크의 읽기 및 쓰기 속도 때문에 가능한 한 하드 디스크 액세스에 의존하는 것이 좋습니다.

아마도 다시 실행하고 그것을 사용할 때 목록에 난수 문자열을 저장하는 것이 해결책 일 것입니다. 디스크에 목록을 쓸 수도 있지만이 방법은 파일을 쓰는 시간에 의존하지 않습니다.

영업이 내 원래의 대답이 문제에 relatede되지 않는다는 것을 분명 해졌다 해당 코드의 자세한 내용을 게시 한 후 편집. 그럼에도 불구하고 그것은 소리입니다.

게재 된 코드 OP는 작성 후 파일을 언제 읽는 지 알기에 충분하지 않습니다. 그가 읽은 후 파일에 쓰고있는 것 같습니다. 물론 이것은 오류로 인식됩니다. 글쓰기 후에 읽기를하면 원하는 것을하는 프로그램을 만들어야합니다. 아이디 추정,이 :

random.readDataFromFile(data); 
random.overwriteRandNums(); 

은 다음 실행 때까지 반영됩니다. 이것 :

random.overwriteRandNums(); 
random.readDataFromFile(data); 

현재 실행시 업데이트 된 파일을 사용합니다.

+2

그건 중요하지 않습니다. 읽히기 위해 다시 파일을 열면 파일에 쓰여진 내용을 읽습니다. – EJP

+0

물론 동의합니다. 내 대답의 목적은 OP가 문제를 해결하고 구현을 단순화하고 (시도 할 이유를 제시 할 수있는) 제안 된 접근 방식이 충분하지 않은 경우 (I/O 부분을 제거하여) 디버그를 쉽게 만들 수있는 것을 제공하는 것입니다. . 하지만 나는 너와 동의한다. –

관련 문제