如何在 Java 中读取字符直到特定的字符?



我想从文件中读几个单词。我没有找到任何方法来做到这一点,所以我决定逐个读取字符,但我需要停在空格处以将读取的单词存储在我的数组中并转到下一个。

我正在进行外部排序应用程序,这就是为什么我有内存限制的原因,在这种情况下,我不能只使用readLine()然后split(),我需要控制我阅读的内容。

read()方法返回一个int,我不知道我该怎么做才能read()方法返回一个字符并在空格后停止读取。

这是我到目前为止的代码:

protected static String [] readWords(String arqName, int amountOfWords) throws IOException {
FileReader arq = new FileReader(arqName);
BufferedReader lerArq = new BufferedReader(arq);
String[] words = new String[amountOfWords];
for (int i = 0; i < amountOfWords; i++){
//words[i] = lerArq.read();
}
return words;
}

编辑1:我使用了扫描仪next()方法,它有效。扫描仪的初始化位于主。

static String [] readWords(int amountOfWords, Scanner leitor) throws IOException {
String[] words= new String[amountOfWords];
for (int i = 0; i < amountOfWords; i++){
words[i] = leitor.next();
}
return words;
}

也许这会有所帮助。

使用read()不是问题.只需将结果投射到一个角色:

...
for (int i = 0; i < memTam; i++) {
// this should work. you will get the actual character
int current = lerArq.read();
if (current != -1) {
char c = (char) current;
// then you can do what you need with this character
}
}
...

该方法以 0 到 65535 范围内的整数形式返回字符读取,如果已到达流的末尾,则返回 -1

。我不会添加很多关于编码的理论,如何在Java中完成它,等等,因为我不知道一些非常低级的细节。我对它的工作原理有一个基本的高层次的了解。

键盘上的每个键都有一个与之关联的数字。您键入的每个字符都可以转换为十进制数。例如,A成为数字65。这是一个标准,是全球公认的。

在这一点上,我希望你能同意read()方法返回一个数字而不是实际的字符:)并不奇怪

有一种叫做ASCII表的东西,它代表了键盘上所有键的所有代码(数字)。

这里只是为了展示 ot 的外观:

Dec  Char                           Dec  Char     Dec  Char     Dec  Char
---------                           ---------     ---------     ----------
0  NUL (null)                      32  SPACE     64  @         96  `
1  SOH (start of heading)          33  !         65  A         97  a
2  STX (start of text)             34  "         66  B         98  b
3  ETX (end of text)               35  #         67  C         99  c
4  EOT (end of transmission)       36  $         68  D        100  d
5  ENQ (enquiry)                   37  %         69  E        101  e
6  ACK (acknowledge)               38  &         70  F        102  f
7  BEL (bell)                      39  '         71  G        103  g
8  BS  (backspace)                 40  (         72  H        104  h
9  TAB (horizontal tab)            41  )         73  I        105  i
10  LF  (NL line feed, new line)    42  *         74  J        106  j
11  VT  (vertical tab)              43  +         75  K        107  k
12  FF  (NP form feed, new page)    44  ,         76  L        108  l
13  CR  (carriage return)           45  -         77  M        109  m
14  SO  (shift out)                 46  .         78  N        110  n
15  SI  (shift in)                  47  /         79  O        111  o
16  DLE (data link escape)          48  0         80  P        112  p
17  DC1 (device control 1)          49  1         81  Q        113  q
18  DC2 (device control 2)          50  2         82  R        114  r
19  DC3 (device control 3)          51  3         83  S        115  s
20  DC4 (device control 4)          52  4         84  T        116  t
21  NAK (negative acknowledge)      53  5         85  U        117  u
22  SYN (synchronous idle)          54  6         86  V        118  v
23  ETB (end of trans. block)       55  7         87  W        119  w
24  CAN (cancel)                    56  8         88  X        120  x
25  EM  (end of medium)             57  9         89  Y        121  y
26  SUB (substitute)                58  :         90  Z        122  z
27  ESC (escape)                    59  ;         91  [        123  {
28  FS  (file separator)            60  <         92          124  |
29  GS  (group separator)           61  =         93  ]        125  }
30  RS  (record separator)          62  >         94  ^        126  ~
31  US  (unit separator)            63  ?         95  _        127  DEL

因此,假设您有一个带有一些文本的.txt文件 - 所有字母都有相应的数字。

ASCII的问题在于 ASCII 定义了 128 个字符,这些字符映射到数字 0-127(所有大写字母、小写字母、0-9 位数字和更多符号)。

但是世界上还有更多不同的字符/符号(不同的字母、表情符号等),所以必须有另一个编码系统来表示它们。

它被称为Unicode。Unicode 对于代码为 0-127 的字符完全相同。但总的来说,Unicode 可以表示更广泛的符号。

在 Java 中,char数据类型(以及Character对象封装的值)基于原始 Unicode 规范,该规范将字符定义为固定宽度的 16 位实体。您可以在此 javadoc 中查看更多详细信息。 换句话说,Java 中的所有字符串都以 UTF-16 表示。

希望,在这个长篇大论之后,为什么你在阅读时得到数字是有道理的,但你可以将它们投射到键入char。同样,这只是一种高级概述。快乐编码:)

如果你想逐个字符地阅读它(这样你就可以更好地控制你想要存储什么和不存储什么),你可以尝试这样的事情:

import java.io.BufferedReader;
import java.io.IOException;
[...]
public static String readNextWord(BufferedReader reader) throws IOException {
StringBuilder builder = new StringBuilder();
int currentData;
do {
currentData = reader.read();
if(currentData < 0) {
if(builder.length() == 0) {
return null;
}
else {
return builder.toString();
}
}
else if(currentData != ' ') {
/* Since you're talking about words, here you can apply
* a filter to ignore chars like ',', '.', 'n', etc. */
builder.append((char) currentData);
}
} while (currentData != ' ' || builder.length() == 0);
return builder.toString();
}

然后这样称呼它:

String[] words = new String[amountOfWordsToRead];
for (int i = 0; i < amountOfWordsToRead; i++){
words [i] = readNextWord(yourBufferedReader);
}

最新更新