首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在DataHandler中添加“文本/纯文本”MIME类型

如何在DataHandler中添加“文本/纯文本”MIME类型
EN

Stack Overflow用户
提问于 2018-02-24 12:43:15
回答 1查看 2.8K关注 0票数 2

我一直在努力让这个测试工作一段时间,相关代码在生产中执行得很好--我的假设是,它有一些额外的配置,很多搜索似乎都与电子邮件处理和其他库有关,我不想包含任何其他内容,我缺少什么来将DataHandler链接到处理“文本/纯文本”的相关方式?

预期结果: DataHandler允许我将输入的“值”流回结果。

复制此代码的问题:

代码语言:javascript
复制
import java.io.IOException;
import java.io.InputStream;

import javax.activation.CommandInfo;
import javax.activation.CommandMap;
import javax.activation.DataHandler;
import org.apache.commons.io.IOUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class DataHandlerTest {

    @Before
    public void setUp() throws Exception {
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void test() throws IOException {

        printDefaultCommandMap();
        DataHandler dh = new DataHandler("Value", "text/plain");
        System.out.println("DataHandler commands:");
        printDataHandlerCommands(dh);
        dh.setCommandMap(CommandMap.getDefaultCommandMap());
        System.out.println("DataHandler commands:");
        printDataHandlerCommands(dh);

        final InputStream in = dh.getInputStream();
        String result = new String(IOUtils.toByteArray(in));

        System.out.println("Returned String: " + result);
    }

    private void printDataHandlerCommands(DataHandler dh) {

        CommandInfo[] infos = dh.getAllCommands();
        printCommands(infos);
    }

    private void printDefaultCommandMap() {

        CommandMap currentMap = CommandMap.getDefaultCommandMap();
        String[] mimeTypes = currentMap.getMimeTypes();

        System.out.println("Found " + mimeTypes.length + " MIME types.");
        for (String mimeType : mimeTypes) {
            System.out.println("Commands for: " + mimeType);
            printCommands(currentMap.getAllCommands(mimeType));
        }
    }

    private void printCommands(CommandInfo[] infos) {

        for (CommandInfo info : infos) {
            System.out.println("   Command Class: " +info.getCommandClass());
            System.out.println("   Command Name: " + info.getCommandName());
        }
    }
}

例外:

javax.activation.UnsupportedDataTypeException:无对象DCH用于MIME类型的文本/平面在javax.activation.DataHandler.getInputStream(DataHandler.java:249)上

帮助非常感谢,我希望这是一个很好的问题!

========================

更新2月25日

如果我知道我在DataHandler中存储了一个字符串,那么我就可以将结果转换为String并返回存储的对象,例如:

代码语言:javascript
复制
@Test
public void testGetWithoutStream() throws IOException {

    String inputString = "Value";
    DataHandler dh = new DataHandler(inputString, "text/plain");

    String rawResult = (String) dh.getContent();
    assertEquals(inputString, rawResult);
}

但是测试中的代码使用InputStream,所以我的“真实”测试在本地执行时仍然失败。继续我的调查,仍然希望有人能在这件事上提供帮助/指导.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-25 10:22:22

回答我自己的问题,供任何人将来参考。

所有功劳都归于:https://community.oracle.com/thread/1675030?start=0

这里的原则是,您需要为DataHandler提供一个包含DataContentHandler的工厂,该工厂将按照您希望的那样对MIME类型进行操作,通过一个似乎影响到所有DataHandler实例的静态方法来设置它。

我声明了一个新类(SystemDataHandlerConfigurator),它有一个公共方法来创建我的工厂,并为它提供静态的DataHandler.setDataContentHandlerFactory()函数。

如果在测试运行之前执行此操作,我的测试现在就可以正常工作了:

代码语言:javascript
复制
SystemDataHandlerConfigurator configurator = new SystemDataHandlerConfigurator();
configurator.setupCustomDataContentHandlers();

SystemDataHandlerConfigurator

代码语言:javascript
复制
import java.io.IOException;
import javax.activation.*;

public class SystemDataHandlerConfigurator {

    public void setupCustomDataContentHandlers() {

        DataHandler.setDataContentHandlerFactory(new CustomDCHFactory());
    }

    private class CustomDCHFactory implements DataContentHandlerFactory {

        @Override
        public DataContentHandler createDataContentHandler(String mimeType) {

            return new BinaryDataHandler();
        }
    }

    private class BinaryDataHandler implements DataContentHandler {

        /** Creates a new instance of BinaryDataHandler */
        public BinaryDataHandler() {

        }

        /** This is the key, it just returns the data uninterpreted. */
        public Object getContent(javax.activation.DataSource dataSource) throws java.io.IOException {

                return dataSource.getInputStream();
        }

        public Object getTransferData(java.awt.datatransfer.DataFlavor dataFlavor, 
                             javax.activation.DataSource dataSource) 
                              throws java.awt.datatransfer.UnsupportedFlavorException, 
       java.io.IOException {

                return null;
        }

        public java.awt.datatransfer.DataFlavor[] getTransferDataFlavors() {

            return new java.awt.datatransfer.DataFlavor[0];
        }

        public void writeTo(Object obj, String mimeType, java.io.OutputStream outputStream) 
         throws java.io.IOException {

                if (mimeType == "text/plain") {
                    byte[] stringByte = (byte[]) ((String) obj).getBytes("UTF-8");
                    outputStream.write(stringByte);
                }
                else {
                    throw new IOException("Unsupported Data Type: " + mimeType);
                }
        }
    }  
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48962997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档