0

我有一个包含数字,字母,特殊字符和符号的文本文件。有一些行我想要在行的开始/中间/结尾处插入RLE unicode控制字符。存储未知数据大小和性能的通用解决方案

首先我需要找出如何捕捉和表示RLE。我想到溪流。我发现RLE占用3个字节-30 -128 -85

InputStream input = new BufferedInputStream (new FileInputStream (file_name_here_with_path)); 
byte[] = input.read(); 

如果什么打印阵列时,应用程序读取包含一个RLE字符,然后你会得到这3个符号数。

下一个问题,当前的问题,是找到一个适合这个信息的容器。

input.read():返回应用程序读取的字节。我可以将它保存在一个字节数组中,但除非知道它的大小,否则我甚至不能创建该数组。不,文件大小不是数组的大小,因为我需要根据我设置的一些条件不止一次将这3个字节插入到数组中。

input.read(byte [] array):返回一个int值,表示读取的字节数。该参数将保存所有信息。与上述相同的问题。固定大小的数组

input.read(byte []数组,偏移量,长度):与前面相同我可以使它从任何我想要的点读取,并且只要我想要的不像前面的读取从开始到结束或者直到引发一些异常

使用bufferedReader:同样的问题。我读了一行,将它保存在一个字符串中,将字符串转换为字节数组(stringname.getBytes())。固定大小。无法插入。

所有4种方法的解决方案是创建一个新的字节数组,并在插入控制字符时将旧数组中的字节移动到新数组中。可能的问题是,据Javier的一位成员说,读取方法很慢。我还没有收到确认,因为我不确定他是否意味着一个特定的读取或全部3.另外,即使我知道在新阵列中需要多少额外的插槽,是不是很好的做法来创建新阵列这样的大小? 这提醒我,我的txt文件是200KB上衣。这不是很多,但我正在寻找正确的做法。通用解决方案!

无论如何,我寻找替代品。我记得使用矢量。是的,他们已经过时了。我不知道为什么,因为我没有为客户创建一个大的应用程序或应用程序,那么我可以使用矢量:P但是,我想我应该继续阅读。然后我遇到了ArrayList,我读了一篇关于它如何更好地发挥作用的帖子here

那么...它会是什么?可能执行缓慢的读取方法或缓冲读取器或过时的向量或快速执行的ArrayList? :P

+0

你打算将它们作为原始字节(自己处理Unicode)还是作为Unicode字符处理(让它们由平台处理)? – rwong

+0

我不确定你的意思。我不明白。但我认为这是第一个。我想自己处理它们。只是写一个例子。如果我的句子是b c d。然后当阅读它时,我得到97 32 98 32 99 32 100.现在我想插入RLE在中间......在B和C之间。所以它变成97 32 98 32 -30 -128 -85 99 32 100希望这有助于。 – user3340667

回答

0

向量被更快的ArrayLists替换,并警告ArrayLists不是线程安全的(但您可以调用集合的同步方法来否定此操作),并具有不同的数据增长方法(每次调整大小需要ArrayList增加了50%的大小,而矢量基本上增加了一倍)。除此之外,他们几乎是一样的。

考虑到你的选择,我会用一个ArrayList来保存Objects(ArrayList),就像这样,你可以保留原始的元素类型。虽然在这种情况下,您需要跟踪每个索引位置中的元素类型(如果有必要)。

+0

我得到了有关调整大小的部分。但前两行不清楚,特别是第一行。阅读文章怎么样?我读一行或使用inputstream阅读? – user3340667

+0

在你的情况下(考虑到你有特殊字符),我会说读取文件的最好方法是使用FileReader - 它保留字符。我不确定InputStream如何处理特殊字符。 – ucsunil

+0

你这是我最终做的。我使用FileReader是因为它更容易检查,但是我的输出是bufferedOutputStream,因为我肯定需要以字节的形式写入。再次感谢。 – user3340667