bufferedReader 关闭文件
bufferedReader closing a File
我在尝试获取 java 文件的 kincaid 值时遇到此错误。我找不到我应该做的 do.As 我知道关闭文件有问题。
我已经尝试了关于 reading-closin 的另一种选择,但我做不到。 closin操作应该怎么做?谢谢。
Exception in thread "main" java.io.IOException: Stream Closed
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at Kincaid.calcWordsAux(Kincaid.java:91)
at Kincaid.main(Kincaid.java:27)
`static ArrayList<String> javaFiles = new ArrayList<String>();
public static void main(String[] args) throws IOException {
File folder = new File("C:/Users/blabla/src");
File[] listOfFiles = folder.listFiles();
for (int i = 0; i < listOfFiles.length; i++) {
if (listOfFiles[i].isFile()) {
if (isItJavaFile(listOfFiles[i])) {
javaFiles.add(listOfFiles[i].getAbsolutePath());
InputStream targetStream = new FileInputStream(
listOfFiles[i]);
System.out.println(calculateKincaid(
calcSyllablesAux(targetStream),
calcWordsAux(targetStream),
calcSentencesAux(targetStream)));
}
} else if (listOfFiles[i].isDirectory()) {
getTheJavaFiles(listOfFiles[i]);
}
}
for (String s : javaFiles) { System.out.println(s); }
}
public static boolean isItJavaFile(File file) {
if ((file.getName().length() > 5)
&& file.getName().substring(file.getName().length() - 5)
.equals(".java"))
return true;
else
return false;
}
public static void getTheJavaFiles(File file) {
boolean x = false;
while (true) {
File[] listOfFiles = file.listFiles();
for (int i = 0; i < listOfFiles.length; i++) {
if (isItJavaFile(listOfFiles[i])) {
if (javaFiles.contains(listOfFiles[i].getAbsolutePath())) {
x = true;
break;
}
javaFiles.add(listOfFiles[i].getAbsolutePath());
} else {
file = new File(file + "/" + listOfFiles[i].getName());
getTheJavaFiles(file);
}
}
if (x == true) {
break;
}
}
}
public static int calcWords(String line) {
int count = 0;
for (int i = 0; i < line.length() - 1; i++) {
if (line.charAt(i) == ' ' && line.charAt(i + 1) != ' ')
count++;
}
return count;
}
public static int calcWordsAux(InputStream file) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(file));
int wordCount = 0;
int ssLine = 0;// slash star gorunce 1 yapiyoruz.comment bitince star
// slash gelince 0.
String line = null;
while ((line = br.readLine()) != null) {
if (ssLine == 1 && (!line.contains("*/"))) {
wordCount += calcWords(line.substring(line.indexOf("*")));
}
if (line.contains("*/")
&& (line.indexOf("*") - line.indexOf("/") == -1)
&& ssLine != 0) {
wordCount += calcWords(line.substring(0, line.indexOf("*")));
ssLine = 0;
}
if (line.contains("//")
&& (line.indexOf("/") - line.lastIndexOf("/") == -1)) {
wordCount += calcWords(line.substring(line.lastIndexOf("/")));
}
if (line.contains("/*")) {
ssLine++;
wordCount += calcWords(line.substring(line.indexOf("/")));
}
}
br.close();
return wordCount;
}
public static int calcSentences(String line) {
int count = 0;
line.indexOf('"');
line = line.replaceAll("\.{3}", "");
String delimiters = "?!.";
for (int i = 0; i < line.length(); i++) {
if (delimiters.indexOf(line.charAt(i)) != -1) {
count++;
}
}
return count;
}
public static int calcSentencesAux(InputStream file) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(file));
int sentencesCount = 0;
int ssLine = 0;// slash star gorunce 1 yapiyoruz.comment bitince star
// slash gelince 0.
String line = null;
while ((line = br.readLine()) != null) {
if (ssLine == 1 && (!line.contains("*/"))) {
sentencesCount+= calcSentences(line);
}
if (line.contains("*/")
&& (line.indexOf("*") - line.indexOf("/") == -1)
&& ssLine != 0) {
sentencesCount += calcSentences(line.substring(0,
line.indexOf("*")));
ssLine = 0;
}
if (line.contains("//")
&& (line.indexOf("/") - line.lastIndexOf("/") == -1)) {
sentencesCount += calcSentences(line.substring(line
.lastIndexOf("/")));
}
if (line.contains("/*")) {
ssLine++;
sentencesCount += calcSentences(line.substring(line
.indexOf("/")));
}
}
br.close();
return sentencesCount;
}
public static int calcSyllables(String line) {
int syllables = line.length()
- line.toLowerCase().replaceAll("a|e|i|o|u|", "").length();
return syllables;
}
public static int calcSyllablesAux(InputStream file) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(file));
int syllablesCount = 0;
int ssLine = 0;// slash star gorunce 1 yapiyoruz.comment bitince star
// slash gelince 0.
String line = null;
while ((line = br.readLine()) != null) {
if (ssLine == 1 && (!line.contains("*/"))) {
syllablesCount += calcSyllables(line);
}
if (line.contains("*/")
&& (line.indexOf("*") - line.indexOf("/") == -1)
&& ssLine != 0) {
syllablesCount += calcSyllables(line.substring(0,
line.indexOf("*")));
ssLine = 0;
}
if (line.contains("//")
&& (line.indexOf("/") - line.lastIndexOf("/") == -1)) {
syllablesCount += calcSyllables(line.substring(line
.lastIndexOf("/")));
}
if (line.contains("/*")) {
ssLine++;
syllablesCount += calcSyllables(line.substring(line
.indexOf("/")));
}
}
br.close();
return syllablesCount;
}`
您正在调用三个方法,为所有方法提供相同的 InputStream
- 每个方法都创建一个 BufferedReader
包装 InputStream
,然后在结束。
关闭 BufferedReader
将关闭基础 InputStream
,导致您看到的错误。
鉴于你要读取文件三次,你应该分别打开它三次......或者打开一次,将所有行读取到一个列表中,然后对该列表进行操作。
我在尝试获取 java 文件的 kincaid 值时遇到此错误。我找不到我应该做的 do.As 我知道关闭文件有问题。 我已经尝试了关于 reading-closin 的另一种选择,但我做不到。 closin操作应该怎么做?谢谢。
Exception in thread "main" java.io.IOException: Stream Closed
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at Kincaid.calcWordsAux(Kincaid.java:91)
at Kincaid.main(Kincaid.java:27)
`static ArrayList<String> javaFiles = new ArrayList<String>();
public static void main(String[] args) throws IOException {
File folder = new File("C:/Users/blabla/src");
File[] listOfFiles = folder.listFiles();
for (int i = 0; i < listOfFiles.length; i++) {
if (listOfFiles[i].isFile()) {
if (isItJavaFile(listOfFiles[i])) {
javaFiles.add(listOfFiles[i].getAbsolutePath());
InputStream targetStream = new FileInputStream(
listOfFiles[i]);
System.out.println(calculateKincaid(
calcSyllablesAux(targetStream),
calcWordsAux(targetStream),
calcSentencesAux(targetStream)));
}
} else if (listOfFiles[i].isDirectory()) {
getTheJavaFiles(listOfFiles[i]);
}
}
for (String s : javaFiles) { System.out.println(s); }
}
public static boolean isItJavaFile(File file) {
if ((file.getName().length() > 5)
&& file.getName().substring(file.getName().length() - 5)
.equals(".java"))
return true;
else
return false;
}
public static void getTheJavaFiles(File file) {
boolean x = false;
while (true) {
File[] listOfFiles = file.listFiles();
for (int i = 0; i < listOfFiles.length; i++) {
if (isItJavaFile(listOfFiles[i])) {
if (javaFiles.contains(listOfFiles[i].getAbsolutePath())) {
x = true;
break;
}
javaFiles.add(listOfFiles[i].getAbsolutePath());
} else {
file = new File(file + "/" + listOfFiles[i].getName());
getTheJavaFiles(file);
}
}
if (x == true) {
break;
}
}
}
public static int calcWords(String line) {
int count = 0;
for (int i = 0; i < line.length() - 1; i++) {
if (line.charAt(i) == ' ' && line.charAt(i + 1) != ' ')
count++;
}
return count;
}
public static int calcWordsAux(InputStream file) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(file));
int wordCount = 0;
int ssLine = 0;// slash star gorunce 1 yapiyoruz.comment bitince star
// slash gelince 0.
String line = null;
while ((line = br.readLine()) != null) {
if (ssLine == 1 && (!line.contains("*/"))) {
wordCount += calcWords(line.substring(line.indexOf("*")));
}
if (line.contains("*/")
&& (line.indexOf("*") - line.indexOf("/") == -1)
&& ssLine != 0) {
wordCount += calcWords(line.substring(0, line.indexOf("*")));
ssLine = 0;
}
if (line.contains("//")
&& (line.indexOf("/") - line.lastIndexOf("/") == -1)) {
wordCount += calcWords(line.substring(line.lastIndexOf("/")));
}
if (line.contains("/*")) {
ssLine++;
wordCount += calcWords(line.substring(line.indexOf("/")));
}
}
br.close();
return wordCount;
}
public static int calcSentences(String line) {
int count = 0;
line.indexOf('"');
line = line.replaceAll("\.{3}", "");
String delimiters = "?!.";
for (int i = 0; i < line.length(); i++) {
if (delimiters.indexOf(line.charAt(i)) != -1) {
count++;
}
}
return count;
}
public static int calcSentencesAux(InputStream file) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(file));
int sentencesCount = 0;
int ssLine = 0;// slash star gorunce 1 yapiyoruz.comment bitince star
// slash gelince 0.
String line = null;
while ((line = br.readLine()) != null) {
if (ssLine == 1 && (!line.contains("*/"))) {
sentencesCount+= calcSentences(line);
}
if (line.contains("*/")
&& (line.indexOf("*") - line.indexOf("/") == -1)
&& ssLine != 0) {
sentencesCount += calcSentences(line.substring(0,
line.indexOf("*")));
ssLine = 0;
}
if (line.contains("//")
&& (line.indexOf("/") - line.lastIndexOf("/") == -1)) {
sentencesCount += calcSentences(line.substring(line
.lastIndexOf("/")));
}
if (line.contains("/*")) {
ssLine++;
sentencesCount += calcSentences(line.substring(line
.indexOf("/")));
}
}
br.close();
return sentencesCount;
}
public static int calcSyllables(String line) {
int syllables = line.length()
- line.toLowerCase().replaceAll("a|e|i|o|u|", "").length();
return syllables;
}
public static int calcSyllablesAux(InputStream file) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(file));
int syllablesCount = 0;
int ssLine = 0;// slash star gorunce 1 yapiyoruz.comment bitince star
// slash gelince 0.
String line = null;
while ((line = br.readLine()) != null) {
if (ssLine == 1 && (!line.contains("*/"))) {
syllablesCount += calcSyllables(line);
}
if (line.contains("*/")
&& (line.indexOf("*") - line.indexOf("/") == -1)
&& ssLine != 0) {
syllablesCount += calcSyllables(line.substring(0,
line.indexOf("*")));
ssLine = 0;
}
if (line.contains("//")
&& (line.indexOf("/") - line.lastIndexOf("/") == -1)) {
syllablesCount += calcSyllables(line.substring(line
.lastIndexOf("/")));
}
if (line.contains("/*")) {
ssLine++;
syllablesCount += calcSyllables(line.substring(line
.indexOf("/")));
}
}
br.close();
return syllablesCount;
}`
您正在调用三个方法,为所有方法提供相同的 InputStream
- 每个方法都创建一个 BufferedReader
包装 InputStream
,然后在结束。
关闭 BufferedReader
将关闭基础 InputStream
,导致您看到的错误。
鉴于你要读取文件三次,你应该分别打开它三次......或者打开一次,将所有行读取到一个列表中,然后对该列表进行操作。