如何读取字符直到 Java 中的特定字符?
How can I read characters until a specific one in Java?
我想从文件中读取几个字。我没有找到任何方法来执行此操作,所以我决定通过 char 读取 char,但我需要在 space 处停止以将读取的单词存储在我的数组并转到下一个。
我正在做一个外部排序应用程序,这就是我有内存限制的原因,在那种情况下,我不能只使用 readLine()
然后 split()
,我需要控制我阅读的内容。
read()
方法return是一个int,我不知道我能对read()
方法做什么return a char 并在 space.
后停止阅读
到目前为止,这是我的代码:
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: 我使用了 Scanner 和 next()
方法,它起作用了。扫描器的初始化在 Main.
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
}
}
...
方法 returns 字符读取,作为 0 到 65535 范围内的整数,如果已到达流末尾则为 -1。
我不会添加很多关于编码的理论,它是如何在 Java 中完成的,等等,因为我不知道一些非常底层的细节。我对它的工作原理有一个基本的高级理解。
键盘上的每个键都有一个与之关联的数字。您键入的每个字符都可以转换为十进制数。例如,A
变成数字 65
。这是一个标准,是全球公认的。
在这一点上,我希望你能同意 read()
方法 returns 一个数字而不是实际字符并不奇怪 :)
有一种叫做 ASCII table 的东西,它代表键盘上所有键的所有代码(数字)。
这里只是为了展示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 数字和更多符号)。
但是世界上还有很多不同的characters/symbols(不同的字母表、表情符号等),所以必须有另一种编码系统来表示它们。
它被称为 Unicode。对于代码为 0-127 的字符,Unicode 完全一样。但总的来说,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);
}
我想从文件中读取几个字。我没有找到任何方法来执行此操作,所以我决定通过 char 读取 char,但我需要在 space 处停止以将读取的单词存储在我的数组并转到下一个。
我正在做一个外部排序应用程序,这就是我有内存限制的原因,在那种情况下,我不能只使用 readLine()
然后 split()
,我需要控制我阅读的内容。
read()
方法return是一个int,我不知道我能对read()
方法做什么return a char 并在 space.
到目前为止,这是我的代码:
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: 我使用了 Scanner 和 next()
方法,它起作用了。扫描器的初始化在 Main.
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
}
}
...
方法 returns 字符读取,作为 0 到 65535 范围内的整数,如果已到达流末尾则为 -1。
我不会添加很多关于编码的理论,它是如何在 Java 中完成的,等等,因为我不知道一些非常底层的细节。我对它的工作原理有一个基本的高级理解。
键盘上的每个键都有一个与之关联的数字。您键入的每个字符都可以转换为十进制数。例如,A
变成数字 65
。这是一个标准,是全球公认的。
在这一点上,我希望你能同意 read()
方法 returns 一个数字而不是实际字符并不奇怪 :)
有一种叫做 ASCII table 的东西,它代表键盘上所有键的所有代码(数字)。
这里只是为了展示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 数字和更多符号)。
但是世界上还有很多不同的characters/symbols(不同的字母表、表情符号等),所以必须有另一种编码系统来表示它们。
它被称为 Unicode。对于代码为 0-127 的字符,Unicode 完全一样。但总的来说,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);
}