空白行を含んだテキストファイルをよみこんで、それをそのまま表示するプログラムをつくりたいのですが、BufferedReaderのreadLineを使うとnullが返ってきてしまいます。どうすれば空白行ということがわかるのですか。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

 readLineは、空行ならば空の文字列を、テキストの終わりならばnullを返しますので、通常は[1]の方法で問題はありません。


しかし、以前に異なるプラットフォームの改行コードが混在するテキストを処理する時に、それと同じ体験をしたことがあります。
SMTPやHTTPのヘッダとボディの区切りは、プラットフォームに関係なく0x0D+0x0Aを使うことになっているので、
この場合にもそのような現象が起きるのではないでしょうか。
 そして、そのときは[2]の方法で対処できたと思います。

-----[1]-----

import java.io.*;

public class textout1 {

public static void main(String args[]) {

String Str1;

try {

BufferedReader BR = new BufferedReader(new FileReader(args[0]));

while ((Str1 = BR.readLine()) != null) System.out.println(Str1);

BR.close();

} catch(Exception ex) { System.out.println(ex.toString()); };

};

}

-----[2]-----

import java.io.*;

public class textout2 {

public static void main(String args[]) {

String Str1;

try {

BufferedReader BR = new BufferedReader(new FileReader(args[0]));

while(true) {
if ((Str1 = BR.readLine()) != null) System.out.println(Str1);
else if (!BR.ready()) break;
};

BR.close();

} catch(Exception ex) { System.out.println(ex.toString()); };

};

}
    • good
    • 0

私もあまりJavaは触っていませんが、EOFExceptionが出なければ空


行という判断をするんじゃないのでしょうか?
    • good
    • 1

常に次の行を見て、EOFかどうかチェックしては


どうでしょうか。
#あまりJavaは触っていないので・・・

ではでは☆
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qテーブルリンク エクセルの4行目を先頭行にしたい

エクセルのデータをアクセスにテーブルリンクしたいのですが
エクセルの先頭行が4行目から始まります。
なおかつA1に文字が入ります。
(画像参照)

このエクセルデータをアクセスの
「テーブルのリンク」→ファイルを選ぶ
→ワークシートリンクウィザードが表示され、次のページに進み、
「先頭行をフィールド名として使う」にチェックを入れたいのですが、先頭行は4行目です。

この場合、どうすればエクセルの4行目を
アクセスのテーブルリンクの先頭行にできるのでしょうか?

エクセルのA1の文字を消去すれば自動的に4行目がアクセスで先頭行になりますが
エクセルの方は決まったフォーマットなのでA1の文字を消去することはできません。

ご回答よろしくお願いします。

Aベストアンサー

#1です

Excel ファイル側に手を入れられるのなら、#2さんの方がお勧めです。

なお、範囲名部分が行方向に増えるのなら、(Excel側で範囲を再設定)
何もせずに Access 側から変更を含めて値を得ることが出来るようですが、
列方向に範囲が広がった場合、 リンクの更新(RefreshLink)が必要みたいです。

嘘を言ってるかも知れないので、裏取りはしっかりとしてください。

QBufferedReader.readline()で読み込んだ文字列の

BufferedReader.readline()で読み込んだ文字列の長さがおかしい。

質問させてください。
BufferedReader.readline()を使用して入力した文字列の長さを表示させると、値が正しく表示されません。

例えば、「東京都千代田区」と入力した場合、長さは9と表示されます。
(東京都と入力すると長さは3と表示されます)

どなたか原因をご存知ありませんでしょうか。

コードを以下に記載します。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Question_1_1 {
/*
* メイン関数
* @param args 起動引数
*/
static public void main(String[] args) throws IOException{
InputStreamReader input = new InputStreamReader(System.in);
BufferedReader buff = new BufferedReader(input);
String str = "";

System.out.println("文字列入力>");
str = buff.readLine();
System.out.println("文字列長さ : " + str.length());

// ストリームを閉じる
input.close();
buff.close();

}
}

BufferedReader.readline()で読み込んだ文字列の長さがおかしい。

質問させてください。
BufferedReader.readline()を使用して入力した文字列の長さを表示させると、値が正しく表示されません。

例えば、「東京都千代田区」と入力した場合、長さは9と表示されます。
(東京都と入力すると長さは3と表示されます)

どなたか原因をご存知ありませんでしょうか。

コードを以下に記載します。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Questi...続きを読む

Aベストアンサー

文字コードが食い違っているのだと思います。
コンソールから呼んでいるのであればchcpするか、もしEclipseを使っているならeclipse.iniに次の一行を足してみてください。


-Dfile.encoding=utf-8

Qエクセルで、条件を指定した行数のカウントについて

エクセルにて、条件に合致する行数のカウントを行うことは出来ますでしょうか。

添付画像のようなエクセルファイルにて、各日毎に「AAA」を含む行は何行あり、「BBB」を含む行は何行あるかをカウントしたいです。

添付のエクセルであれば、A列が「10月1日」でB列に「AAA」を含む行は○行という条件でカントが出来れば実現可能とは思いますが、
こういったカウントの仕方がそもそもエクセルで出来るのかどうか知りたいです。

もし、エクセル以外の方法で可能なのであれば、その方法も教えていただけるとありがたいです。

Aベストアンサー

SUMPRODUCT関数などを使った場合にはデータ数が多くなった場合には計算が重くなります。
作業列を使った方法がよいでしょう。
お示しのデータがシート1に有るとしてC列を作業列としてC2セルには次の式を入力して下方にオートフィルドラッグします。

=IF(A1="","",IF(COUNTIF(B1,"AAA*"),A1&"AAA",IF(COUNTIF(B1,"BBB*"),A1&"BBB","")))

次にお望みの表を別のシートに表示させるとしたら別のpシートのB1セルにはAAAと入力しC1セルにはBBBと入力します。
A2セルから下方には例えば10月1日からの日付を入力します。
B2セルには次の式を入力してC2セルまでオートフィルドラッグしたのちに下方にもオートフィルドラッグします。

=IF($A2="","",COUNTIF(Sheet1!$C:$C,$A2&B$1))

QNULLが返ってこない…。

原因がわからないため質問をさせて頂きます。
<%-- JSP
<input type="text" name="name"> //名前
String name = request.getParameter("name");
Data data = new Data(); //コンストラクタをnew
data.setName(name);
--%>

<%-- class(Bean)
private String n = null;
public void setName(String name){
if(name != null){
n = name;
}else{
n = null;
}
public String getName(){
if(name != null){
return name;
}else{
return name;
}
}

--%>
値をgetParameter()メソッドで取得をして
値をsetName(name);でセットをしています。

セットした側でもし値があるのであれば
その値を変数に格納。
もし値がなければnullを変数に格納しています。

しかし System.out.println(data.getName().equals("");//true
System.out.println(data.getName().equals(null);//false;

となりnullを返してくれません…。

このコードに何を足したらnullを返してくれるのか
わかりません。
わかる方がいらっしゃいましたらよろしくお願い致します。

原因がわからないため質問をさせて頂きます。
<%-- JSP
<input type="text" name="name"> //名前
String name = request.getParameter("name");
Data data = new Data(); //コンストラクタをnew
data.setName(name);
--%>

<%-- class(Bean)
private String n = null;
public void setName(String name){
if(name != null){
n = name;
}else{
n = null;
}
public String getName(){
if(name != null){
return name;
}else{
return name;
}
}

--%>
値をgetParameter()メソ...続きを読む

Aベストアンサー

><input type="text" name="name"> //名前

formにこのタグがある場合、未入力だったとすると
リクエストには「name=」がのります。
で、これを
>request.getParameter("name");
するとnameはあるが値がブランクなので
""(ブランク文字)が取得されます。
で、""≠nullですので動きは正しいです。

もしブランク文字の場合もnullとしたいのであれば、
>data.setName(name);
この行の前に、下記1行を足してブランク文字の場合、nullとするようなことをしなければなりません。
if ("".equals(name)) name = null;

Qテキストファイルから必要な項目(行)をエクセルの行に移行させるには

テキストファイルから必要な項目(行)をエクセルの行に移行させる簡単な方法を教えて下さい。
1テキスト=エクセルの1行

Aベストアンサー

コピーアンドペーストでうまくいく気がします。
テキストファイルを、ノートパッドなどで開いて、全文をコピーし、エクセルに貼り付けるだけです。エクセルは、左上端のセル一つだけが選択された状態にしておきます。複数のセルを選択しているとサイズが合わないと文句を言われるかもしれません。

QreadLineとStringTokenizerで一行ずつ計算するプログラムでエラーが出る

初めに行数があり、次に6つのスペースで区切られた数字を一行ずつ計算していくというプログラムが作りたいのですが、実行後
Exception in thread "main" java.lang.NullPointerException at java.util.StringTokenizer.<init>(StringTokenizer.java:182) at java.util.StringTokenizer.<init>(StringTokenizer.java:219) at example.main(example.java:36)
のようなエラーが出てきます。下記がそのプログラムですが、stのコンストラクタがループの中に入っているせいだと思い、ループの外でコンストラクトしようと考えたのですがうまくいかずいきづまってしまいました。
どなたかご教示いただけませんでしょうか。よろしくお願いいたします。

int c=0;
String line ;
int ln = Integer.parseInt(br.readLine());
for(int i = 0; i < ln; i++) {
line=br.readLine();
StringTokenizer st = new StringTokenizer(line);
for(j = 0; j <= 5; j++) {
c=Integer.parseInt(st.nextToken());
intArray[j]=c;
}
(計算)
}

初めに行数があり、次に6つのスペースで区切られた数字を一行ずつ計算していくというプログラムが作りたいのですが、実行後
Exception in thread "main" java.lang.NullPointerException at java.util.StringTokenizer.<init>(StringTokenizer.java:182) at java.util.StringTokenizer.<init>(StringTokenizer.java:219) at example.main(example.java:36)
のようなエラーが出てきます。下記がそのプログラムですが、stのコンストラクタがループの中に入っているせいだと思い、ループの外でコンストラクトし...続きを読む

Aベストアンサー

ファイルの終了まで読み込むと、
 line=br.readLine();
のところでnullが返されます。

そして、
 StringTokenizer st=new StringTokenizer(line)
の時点でlineがnullだと、ご質問のようなExceptionが発生します。

そのためファイル読み込みが終了した時点でループを抜けるように、
 line=br.readLine();
の直後に
 if(line==null){
  break;
 }
を入れてループを抜けるようにすればよいと思います。

Qエクセルの行の幅について

 エクセルの行幅を立ち上げ時点から太くしたいと思います。
 エクセルの行の幅は、立ち上げると12.75という高さになっているようです。しかし、これでは少々見づらいので15くらいにしたいと思います。
 もちろん、「行の高さ」で変更できるのは分かるのですが、毎回、修正するのが煩雑です。従って、立ち上げた初期段階から行の高さを変更することはできないでしょうか。

Aベストアンサー

う~ん。

確か、エクセルの初期設定で変更できるのは、
「シート数」「フォントの書体」「フォントの大きさ」
くらいだったと思います。
行の幅を、立ち上げ時から指定の幅にする事は出来なかったような…。

私自身、エクセルを結構利用するのですが、行の幅を変更するときは、
「全選択(画面左上の行(1)の上、と列(A)の左、の長方形の部分をクリック)」して、
行(1)と、行(2)の間にある線をドラッグして一気に全ての行の幅を変えています。

もし、それすらも煩雑と感じるほどにエクセルを新規で立ち上げているのであれば、
以下の方法はどうでしょうか?

1.行の幅を15に設定した「白紙のエクセル」をデスクトップに保存する。
2.新規で利用したい場合は、1で保存したエクセルをデスクトップ上でコピー(Ctrl + C)&ペースト(Ctrl + V)
3.ペーストしたエクセル(白紙で行幅15)を立ち上げる。

こうすれば、毎回行幅を変更する事なく、立ち上げ時から行幅15のエクセルが使用できますよ♪

ただ、全選択して一気に行幅を変える前者のやり方の方が簡単な気もしますが…。(汗

う~ん。

確か、エクセルの初期設定で変更できるのは、
「シート数」「フォントの書体」「フォントの大きさ」
くらいだったと思います。
行の幅を、立ち上げ時から指定の幅にする事は出来なかったような…。

私自身、エクセルを結構利用するのですが、行の幅を変更するときは、
「全選択(画面左上の行(1)の上、と列(A)の左、の長方形の部分をクリック)」して、
行(1)と、行(2)の間にある線をドラッグして一気に全ての行の幅を変えています。

もし、それすらも煩雑と感じるほどにエクセルを新規で立...続きを読む

Q(String)nullはnullではなく文字列?

引数として、(String)nullを渡しているコードがあるのですが、
これは「null」ではなく文字列としての「null」を渡しているのでしょうか?

・Stringでキャストしていると思うのですが、nullもキャストできるのでしょうか?
・それとも何か特別な意味がある?

Aベストアンサー

>Stringでキャストしていると思うのですが、nullもキャストできるのでしょうか?

他の回答にもあるように、キャストするのは構いませんがnullはnullです。


>それとも何か特別な意味がある?

意味があるとすれば、メソッドがオーバーロードしているときに、どのメソッドを呼び出すか特定するときに指定するくらいだと思います。
(オーバーロード:同じクラスの中で、同じ名称だけど引数の指定が違うメソッド)

例えば、

void methodA(String s) {
System.out.print("String:" + s);
}
void methodA(Integer i) {
System.out.print("Integer:" + i);
}

があったとき、

methodA(null);
ではどちらのメソッドを呼び出すか特定できませんが、

methodA((String)null);
にすると、
void methodA(String s)
のほうを呼び出します。

Qエクセルの行の幅がずれる

エクセルで表を作っているのですが
行の高さを25にして確かめてみると
どうしても24.5というように25の幅になっていません。
どうすればきっちり自分の設定した行の高さになるのでしょうか教えてください。
エクセルは2000を使っています。

Aベストアンサー

セルの高さの単位はなんでしょう?
ポイントという単位なのですが、1ポイントは約0.35mmでポイントは文字の大きさの単位と同じです。エクセルでは11ポイントの場合標準の高さが13.5、14ポイントでは17.5と変化します。
エクセルの標準フォントの高さを基準にしています。(これはオプションで変更できます。)

ピクセルと言う基準があって、これをポイントと言う単位に直しているので、25と言う端数のない数値にならない事がある。

例えば、幅はどうでしょう、これは標準フォントの文字数を表しています。(規定があるのですが省略)

と言う事で、出来ません。
25の右にあるピクセルと言う単位を基本に使うようにしたらいかがでしょう。
例えば列幅とも100ピクセルを選択するとセルは正方形になります。(ピクセルは列幅とも同じ物です。)
この併記はエクセル2000から始まったようですが。(単位が違うので、合わせるためみたいです。)

Q空白を返す処理

JSPにおいて、日付入力用のテキスト入力欄に、値を未入力(空白)のまま、データベースにsubmitさせた場合、"1900/1"とした初期値が返されるという処理のプログラムが手元にございます。。。これを、"1900/1"でなく、空文字が返されるという処理に変更したいのですが、思うようにうまくいきません。
どなたか、良い方法を教えてくださいませ。

Aベストアンサー

その処理の中で、nullの場合には"1900/1"をreturnするようにしてあるのであればそれを空文字にすればいいのでは?それか、SQLで日付を取得する際にDECODE関数を使用する手もあります。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング