我正在用java标记文本文件 . 我想读取一个输入文件,对其进行标记,然后将已标记的某个字符写入输出文件 . 这是我到目前为止所做的:
package org.apache.lucene.analysis;
import java.io.*;
class StringProcessing
{
// Create BufferedReader class instance
public static void main(String[] args) throws IOException
{
InputStreamReader input = new InputStreamReader(System.in);
BufferedReader keyboardInput = new BufferedReader(input);
System.out.print("Please enter a java file name: ");
String filename = keyboardInput.readLine();
if(!filename.endsWith(".DAT"))
{
System.out.println("This is not a DAT file.");
System.exit(0);
}
File File = new File(filename);
if(File.exists())
{
FileReader file = new FileReader(filename);
StreamTokenizer streamTokenizer = new StreamTokenizer(file);
int i=0;
int numberOfTokensGenerated = 0;
while(i != StreamTokenizer.TT_EOF)
{
i = streamTokenizer.nextToken();
numberOfTokensGenerated++;
}
// Output number of characters in the line
System.out.println("Number of tokens = " + numberOfTokensGenerated);
// Output tokens
for (int counter=0; counter < numberOfTokensGenerated; counter++)
{
char character = file.toString().charAt(counter);
if (character == ' ') System.out.println();
else System.out.print(character);
}
}
else
{
System.out.println("File does not exist!");
System.exit(0);
}
System.out.println("\n");
}//end main
}//end class <code>
当我运行此代码时,这就是我得到的:
Please enter a java file name: D://eclipse-java-helios-SR1-win32/LexractData.DAT Number of tokens = 129 java.io.FileReader@19821fException in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 25 at java.lang.String.charAt(Unknown Source) at org.apache.lucene.analysis.StringProcessing.main(StringProcessing.java:40)
输入文件如下所示:
`-K1账号
--Op1退出
--- Param1 an
----输入Int
--- Param2金额
----输入Int
--Op2存款
--- Param1 an
----输入Int
--- Param2金额
----输入Int
--CA1 acNo
---类型Int
-K2 CheckAccount
--SC帐户
--CA1 credit_limit
---类型Int
-K3客户
--CA1名称
---键入字符串
-K4交易
--CA1日期
---输入日期
--CA2时间
---输入时间
-K5 CheckBook
-K6检查
-K7 BalanceAccount
--SC账户
我只想读取以 -K1
, -K2
, -K3
等开头的字符串......任何人都可以帮助我吗?
2 回答
问题在于这条线 -
file
是对FileReader
的引用,它没有实现toString()
..它调用 Object.toString() ,它打印一个大约25个字符长的引用 . 这就是为什么你的异常在第26个字符处说出OutofBoundsException .要正确读取文件,您应该使用bufferedreader包装文件读取器,然后将每个readline放入stringbuffer .
//
Now use sb.toString() instead of file.toString()
如果您想要标记输入文件,那么显而易见的选择是使用扫描仪 . Scanner类读取给定的输入流,并可以输出令牌或其他扫描类型(scanner.nextInt(),scanner.nextLine()等) .
查看Oracle's documentation of the Scanner class了解更多信息 .