Java 字符串行限制?
我正在写一个方法,它将从一个文本文件中读取数据,并告诉这个文本文件中有多少人是1920年到1984年出生的,但出于某种原因,它最多只能存储45行Java 字符串行限制?,java,string,Java,String,我正在写一个方法,它将从一个文本文件中读取数据,并告诉这个文本文件中有多少人是1920年到1984年出生的,但出于某种原因,它最多只能存储45行 private Buffin itsFile = new Buffin("workers.txt"); private static final int TIME_SPAN = 65; private static final int YEAR = 1920; public String countBirthYears() { try
private Buffin itsFile = new Buffin("workers.txt");
private static final int TIME_SPAN = 65;
private static final int YEAR = 1920;
public String countBirthYears()
{
try
{
int[] count = new int[TIME_SPAN];
//== READ THE WORKER DATA AND UPDATE THE COUNTS
Worker data = new Worker(itsFile.readLine());
while(data.getName() != null)
{
if((data.getBirthYear() - YEAR) >= 0 && (data.getBirthYear() - YEAR) <= 1984){
int lastDigit = data.getBirthYear() % 10;
count[lastDigit]++;
}
data = new Worker(itsFile.readLine());
}
//== CONSTRUCT THE STRING OF ANSWERS
String s = "";
for(int k = 0; k < TIME_SPAN; k++)
s += (YEAR + k) + " : " + count[k] + " workers\n";
return s;
}catch(Exception e){JOptionPane.showMessageDialog(null, e); return "";}
}
private Buffin itsFile=new Buffin(“workers.txt”);
专用静态最终整数时间_SPAN=65;
私人静态最终整数年=1920;
公共字符串countBirthYears()
{
尝试
{
int[]计数=新的int[时间跨度];
//==读取工人数据并更新计数
工人数据=新工人(itsFile.readLine());
while(data.getName()!=null)
{
如果((data.getBirthYear()-YEAR)>=0&&(data.getBirthYear()-YEAR)是,字符串是有限的。据我所知,限制取决于JVM,类似于64K
但这并不重要。您不必将整个文件读入一个字符串来检测有多少人符合您的条件。即使字符串大小没有限制。如果您的文件包含所有70亿人的列表,该怎么办?您是否希望在内存中保留整个列表,以便在运行结束时返回一个简单的计数器
您必须逐行读取文件,解析每一行,并在需要时增加计数器。无需将全部信息存储在RAM中。字符串的大小在Java中是有限的。字符串对象可以容纳的字符量实际上等于整数。MAX_值
。如果超过此长度,您应该ider使用StringBuffer
或StringBuilder
创建输出,基于您是否在不同线程中使用它(StringBuffer是同步的)
你可以用
StringBuffer sb = new StringBuffer();
for(int k = 0; k < TIME_SPAN; k++)
s.append(YEAR + k).append(" : ").append(count[k]).append(" workers\n");
return sb; //sb.toString();
StringBuffer sb=new StringBuffer();
对于(int k=0;k
注意:如果堆的大小很小,则可能会受到更大的限制
长度可以是整数。MAX_VALUE
或堆大小的一半,以较小者为准。事实上,这不是一个真正的答案,但我想在您的代码中解决一些问题,我希望它能帮助您:
一,
实际上,把1973年出生的人和1983年出生的人加起来(例如)……这就是你真正想要的吗
可能问题不在字符串限制中,但逻辑中可能存在某些问题…您是否验证了count
包含正确数量的条目?此外,如果您逐个打印行,则会打印正确的计数?您是否调试并按方法打印s返回的值是的,我每次都打印s通过循环,它工作正常。但我不确定为什么仅仅使用该方法时它不正常。因此,您在使用该方法或在任何文件中写入时面临问题?@IanLundberg-Hurrah!很高兴问题得到解决!@user2864740,可能是640。这真的不重要。问题是OP正在将整个文件读取到RAM中。将整个文件读取到我的内存中mory听起来也没那么糟糕;至少不是天生如此,即使它并不理想。(整个莎士比亚的收藏应该只有5.5MB;即使是550MB,也只有半GB。)@用户2864740,莎士比亚的作品集有多大并不重要。重要的是,没有理由仅仅为了生成一个简单的计数器而将整个数据从磁盘读取到RAM中。当以增量方式读取数据时,可以找到这个计数器。这里重要的是读取实际的问题,而不仅仅是标题。(代码实际上执行以下操作。)“建议的解决方案”,只是在最后对输出进行了混乱的重新构建。)我确实读过这个问题。问题是代码只读取前45行。我试图解释,编写的代码在概念上是错误的。例如,如果用户足够幸运,可以使用小文件或使用StringBuilder
等等,则此代码可以工作。他将继续使用此错误模式编写代码,并且稍后再遇到问题。我只是想在一开始就避免这种情况。我怀疑他是否遇到了硬限制;当然,如果代码存在,肯定会出现异常或其他情况。我在使用StringBuilder运行方法时仍然遇到了相同的问题,我刚刚尝试过:/这是输出的样子是的,谢谢你指出这些,我只是快速查看代码还没有检查任何内容,但谢谢:)
if((data.getBirthYear() - YEAR) >= 0 && (data.getBirthYear() - YEAR) <= 1984)
if((data.getBirthYear() - YEAR) >= 0 && (data.getBirthYear() - YEAR) <= TIME_SPAN)
int lastDigit = data.getBirthYear() % 10;
count[lastDigit]++;