2009-04-04 16 views
8

Tôi tìm một ví dụ về cách áp dụng biểu thức chính quy cho luồng I/O Java không chỉ chuyển đổi luồng thành chuỗi như tôi muốn bảo toàn dữ liệu nhị phân. Hầu hết các ví dụ trên Internet tập trung vào dữ liệu văn bản ...Áp dụng cụm từ thông dụng vào luồng I/O Java

+1

Bạn đang tìm kiếm điều gì? Từ chối dữ liệu không khớp với regexp? Và những gì bạn muốn để phù hợp trên nếu bạn không quan tâm đến chuỗi? Một số làm rõ sẽ là tốt –

+0

Chỉ cần làm rõ: Một chuyển đổi cho các ký tự và trở lại dữ liệu nhị phân có thể có tác động hiệu suất nhưng không một byte nào sẽ bị mất do chuyển đổi. – rwitzel

+0

có thể trùng lặp của [Thực hiện regex trên luồng] (http://stackoverflow.com/questions/3013669/performing-regex-on-a-stream) –

Trả lời

0

Chuyển đổi luồng thành mảng byte.

+0

Cần lưu ý rằng điều này chỉ có ý nghĩa nếu đầu vào có thể được tải vào bộ nhớ trong cả hai điều khoản về kích thước của nó và thời gian cần thiết cho việc tải! Điều đó có nghĩa là bạn cần phải biết lengh của dữ liệu được cung cấp bởi các dòng để viết một chương trình đáng tin cậy. Biết được độ dài đầu vào của một luồng mâu thuẫn với mục đích của nó để cung cấp dữ liệu có khả năng bất tận! –

-2

Hoạt động regex phải được thực hiện trên các chuỗi, là các byte được mã hóa dữ liệu nhị phân. Bạn không thể thực hiện các hoạt động regex trên các byte dữ liệu mà bạn không biết chúng đại diện cho những gì.

+8

-1 Tôi không đồng ý. Không có lý do tại sao bạn không thể áp dụng biểu thức chính quy cho dữ liệu nhị phân. Dữ liệu nhị phân không có nghĩa là bạn không có ý tưởng về những gì chúng đại diện. –

+0

Giả sử, bạn có thể lấy luồng 0 và 1 và thực hiện regex trên đó. Tuy nhiên, không có API Java nào hiện có cung cấp cho bạn quyền truy cập vào luồng thô đó mà không chuyển đổi nó thành một cái gì đó có ý nghĩa hơn. –

+0

+1 đồng ý, Áp dụng regexp trên dữ liệu nhị phân không có ý nghĩa. Regexps về cơ bản là hướng tới các chuỗi, chúng được định nghĩa bằng cách sử dụng Strings, vì vậy bạn sẽ luôn sử dụng mã hóa chuỗi, một cách rõ ràng hoặc ngầm. –

9

Chức năng cần thiết không có trên Tiêu chuẩn Java. Bạn sẽ phải sử dụng jakarta regexp và cụ thể là lớp StreamCharacterIterator. Lớp này gói gọn một InputStream để sử dụng trong các hoạt động regexp.

Nếu bạn muốn sử dụng gói biểu thức chính quy chuẩn, tôi khuyên bạn nên lấy nguồn từ lớp trước here và thay đổi hợp đồng bằng cách thực hiện CharSequence thay vì CharacterIterator.

+1

Một vấn đề với việc thực hiện CharSequence là giao diện yêu cầu lớp để thực hiện 'chiều dài int công cộng()'. Nếu bạn đang đọc từ một luồng, thì bạn sẽ không biết độ dài và sẽ không thể trả lời câu trả lời cho công cụ regex. – monkeysplayingpingpong

0

Hãy thử sử dụng Ragel - công cụ biểu thức chính quy với chuyển tiếp cuộc gọi lại.

Có thể áp dụng cho các luồng và đoạn.

Các vấn đề liên quan