我正在尝试在Scala中修改一个大的PostScript文件(有些文件大小达到1GB)。该文件是一组批处理,每个批处理包含代表批处理编号、页面数量等的代码。
我需要:
1. 搜索批处理代码(始终从文件中的同一行开始)。 2. 计算到下一个批处理代码的页面数。 3. 修改批处理代码以包括每个批处理中的页面数。 4. 将新文件保存在不同的位置。
我的当前解决方案使用两个迭代器(iterA和iterB),这两个迭代器都是通过Source.fromFile("file.ps").getLines创建的。第一个迭代器(iterA)在while循环中遍历到批处理代码的开头(iterB.next每次被调用)。然后,iterB继续搜索直到下一个批处理代码(或文件末尾),并计算它经过的页面数。接着,它会更新iterA位置处的批处理代码,然后重复此过程。
这似乎非常不像Scala,并且我仍然没有设计出将这些更改保存到新文件中的好方法。
对于这个问题,有什么好的方法吗?我应该完全放弃迭代器吗?最好不要一次性将整个输入或输出存入内存中。
谢谢!
我需要:
1. 搜索批处理代码(始终从文件中的同一行开始)。 2. 计算到下一个批处理代码的页面数。 3. 修改批处理代码以包括每个批处理中的页面数。 4. 将新文件保存在不同的位置。
我的当前解决方案使用两个迭代器(iterA和iterB),这两个迭代器都是通过Source.fromFile("file.ps").getLines创建的。第一个迭代器(iterA)在while循环中遍历到批处理代码的开头(iterB.next每次被调用)。然后,iterB继续搜索直到下一个批处理代码(或文件末尾),并计算它经过的页面数。接着,它会更新iterA位置处的批处理代码,然后重复此过程。
这似乎非常不像Scala,并且我仍然没有设计出将这些更改保存到新文件中的好方法。
对于这个问题,有什么好的方法吗?我应该完全放弃迭代器吗?最好不要一次性将整个输入或输出存入内存中。
谢谢!
Source.fromFile("in.ps").getLines.toStream
会保留流的头部。请参见 https://dev59.com/X17Va4cB1Zd3GeqPL6lM#8640680 和 https://issues.scala-lang.org/browse/SI-4835。 - huynhjl