我们正在使用JAVA 8和
以下是我的问题的背景:
我们的计划中有一张地图,如下所示:
<Key, object containing (record-offset, record-lentgh)
我们必须计算应包含行分隔符的文件中每条记录的长度,以计算每条记录的记录偏移量。 例如:
record-offset of 1st record in the file = 0
record-offset of 2nd record in the file =
record-offset of 1st record in the file
+ record length of 1st record
and so on...
在后一个过程中,我们将使用这些记录偏移和记录长度信息从 RandomAccessFile 中读取文件中的每条记录。
此过程非常快,可以在运行时为我们节省内存。
现在的问题是:
当我使用BefferedReader.readLine()读取文件中的每个记录并且从返回的字符串的长度计算记录长度和记录偏移时,这个记录偏移计算正在搞乱。 BefferedReader将行分隔符字符分开。 DOS文件的行分隔符是\ r \ n,而Unix / MAC文件的行分隔符是\ n。因此,我使用RandomAccessFile读取文件的后一个过程由于错误的偏移而搞砸了。看起来像修复我必须计算偏移量,从第二条记录开始这样:
line-separator-length = 2;\\for DOS or 1 for UNix type file
record-offset of 2nd record in the file =
record-offset of 1st record in the file
+ record length of 1st record
+ line-separator-length
因此,我的问题是:
OR
OR
提前致谢。
答案 0 :(得分:0)
是否有从包含行分隔符的文件中读取每一行?
不确定。使用BufferedReader作为模型扩展抽象类Reader。包括行分隔符字符。
有没有办法弄清楚它是什么类型的文件?
不确定。 Unix以换行符结束(\ n),Windows以回车符结束,换行符(\ r \ n)和Mac(OS 10+)以换行符结束(\ n)。
较旧的Mac以回车符结束(\ r \ n)。
有什么方法可以检查文件中的行分隔符是什么?
您的Reader类将返回String的最后或最后2个位置的行分隔符。
答案 1 :(得分:0)
这就是我解决问题的方法:感谢您的讨论: How to find out which line separator BufferedReader#readLine() used to split the line?
public int getLineTerminatorLength( String filePath ) throws FileUtilitiesException
{
try (BufferedReader tempreader = FileUtilities.getBufferedReader( new File( filePath ) ))
{
String l = "";
char termChar = ' ';
while ( ( termChar = (char) tempreader.read() ) != -1 )
{
if ( ( termChar == '\n' ) || ( termChar == '\r' ) )
{
char ctwo = ' ';
if ( ( ctwo = (char) tempreader.read() ) != -1 )
{
if ( ( ctwo == '\n' ) || ( ctwo == '\r' ) )
return 2;
}
return 1;
}
}
}
catch ( Exception e )
{
String errMsg = "Error reading file " + filePath;
throw new FileUtilitiesException( errMsg );
}
//Will reach here if it is empty file
return 0;
}