如何在Java中读取固定长度的文件

时间:2019-03-06 15:34:15

标签: java parsing reader

我正在读取固定长度的Java平面文件 我是新手,有人可以帮我做定长阅读器吗?

1 个答案:

答案 0 :(得分:0)

当它是文本文件,具有固定长度时,普通读者就足够了。

这假设每个记录的末尾都有换行符。

TThread

#include <vcl.h> #include <functional> namespace { class wrapper : public TCppInterfacedObject<TThreadProcedure> { public: wrapper(std::function<void(void)> f) : f_(f) {} void __fastcall Invoke() { f_(); } private: std::function<void(void)> f_; }; const unsigned int main_thread = GetCurrentThreadId(); } // namespace // Execute the function asynchronously in main thread void queue_to_main_thread(std::function<void(void)> f) { if (GetCurrentThreadId() == main_thread) { f(); } else { TThread::Queue(NULL, _di_TThreadProcedure(new wrapper(f))); } } // Execute the function synchronously in main thread void synchronize_to_main_thread(std::function<void(void)> f) { if (GetCurrentThreadId() == main_thread) { f(); } else { TThread::Synchronize(NULL, _di_TThreadProcedure(new wrapper(f))); } } 删除(“ Mary”)之前和(“” 89“)之后的空格。 List<MyRecord> result = new ArrayList<>(); Path file = Paths.get("C:/Import/20190308.txt"); Charset charset = Charset.defaultCharset(); Files.lines(path, charset) .filter(line -> line.length() != 142) .forEach(line -> { MyRecord record = new MyRecord(); record.id = Long.parseLong(line.substring(0, 10).trim()); record.name = line.substring(10, 50).trim(); record.age = Integer.parseInt(line.substring(50, 53).trim()); ... result.add(record); }); 选择固定字段。

读取行没有换行符-通常为String.trim()String.substring(position, nextPosition)。 检查线长(此处为142)。这是\r\n s的长度,但很可能也是字节的长度,因为固定长度的记录可能在单个字节的字符集中。


对于一些自定义类MyRecord,它们反映了CSV行:

\n